package com.nowcoder.community.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.RedisSerializer;


/**
 * @BelongsProject: community
 * @BelongsPackage: com.nowcoder.community.config
 * @Author: Master_XXJS
 * @CreateTime: 2023-01-03  15:24
 * @Description: TODO 将 java 数据存储的 redis 数据库中的时候，将数据进行序列化
 * @Version: 1.0
 */
@Configuration
public class RedisConfig {

    /**
     * 底层自动扫描这个返回值是 RedisTemplate 的Bean 进行替换，类似 security 中学习的
     *
     * 因为，我们编程的是 java 数据，redis 非关系数据中存储的数据类型和我们的不一样，所以我们需要
     * 将 从java传递到redis中进行保存的数据进行 序列化，方便接受
     * 好比就是类似，前后端分离的时候
     * @param factory redis 连接的工厂，底层生成的
     * @return
     */
    @Bean
    public RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory factory){
        //将 返回值 进行实例化
        RedisTemplate<String,Object> template = new RedisTemplate<>();
        template.setConnectionFactory(factory);

        /*
            因为，key只能存储的java是 stirng 类型，所以 redis 进行接受的是 string 就可以了
            value 因为是有不同的数据类型，所以 我们需要转换为  json  数据进行存储到 redis 中
         */
        //设置key的序列化方式
        template.setKeySerializer(RedisSerializer.string());
        //设置value的序列化方式
        template.setValueSerializer(RedisSerializer.json());
        //设置hash的key的序列化方式
        template.setHashKeySerializer(RedisSerializer.string());
        //设置hash的value的序列化方式
        template.setHashKeySerializer(RedisSerializer.json());

        //将上面的设置进行触发，不然不会生效
        template.afterPropertiesSet();

        return template;
    }
}

